#pragma once

struct tagDecimalNode {
	unsigned char value;
	struct tagDecimalNode * prev;
	struct tagDecimalNode * next;
};

struct tagDLinkedList {
	struct tagDecimalNode * head;
	struct tagDecimalNode * tail;
};

struct tagBigDecimal {
	char posi;
	struct tagDLinkedList * inte;
	struct tagDLinkedList * floa;
};

typedef struct tagDecimalNode DECIMALNODE, *PDECIMALNODE;
typedef struct tagDLinkedList DLINKEDLIST, *PDLINKEDLIST;
typedef struct tagBigDecimal BIGDECIMAL, *PBIGDECIMAL;

int	DLinkedList_IsEmpty(PDLINKEDLIST);
PDLINKEDLIST DLinkedList_CreateList();
void DLinkedList_ReleaseList(PDLINKEDLIST);

PDECIMALNODE DLinkedList_CreateNode(unsigned char);
PDECIMALNODE DLinkedList_AppendNode(PDLINKEDLIST,PDECIMALNODE);
PDECIMALNODE DLinkedList_RemoveNodeFromTail(PDLINKEDLIST);
PDECIMALNODE DLinkedList_RemoveNodeFromHead(PDLINKEDLIST);
void DLinkedList_ReleaseNode(PDECIMALNODE);

PBIGDECIMAL BigDecimal_CreateBigDecimal();
void BigDecimal_ReleaseBigDecimal(PBIGDECIMAL);
void BigDecimal_OutputBigDecimal(PBIGDECIMAL);

PBIGDECIMAL BigDecimal_ConvertFromString(const char*, int);

PBIGDECIMAL BigDecimal_Plus(PBIGDECIMAL, PBIGDECIMAL);
PBIGDECIMAL BigDecimal_Minu(PBIGDECIMAL, PBIGDECIMAL);
PBIGDECIMAL BigDecimal_Mult(PBIGDECIMAL, PBIGDECIMAL);
PBIGDECIMAL BigDecimal_Divi(PBIGDECIMAL, PBIGDECIMAL);
PBIGDECIMAL BigDecimal_Fact(PBIGDECIMAL);